home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
fb386
/
game
/
puz
/
puz.bas
< prev
next >
Wrap
BASIC Source File
|
1995-02-15
|
11KB
|
296 lines
10000 *START
10010 DIM SNE(1632),PNE(342),WWIN(9888),SNU(532),PNU(342),WNUM(5400),WYNO(2700),A(1000),B(5400)
10020 ON KEY(10) GOSUB *CP_START:KEY(10) ON:CP_X=100:CP_Y=100
10030 CLS:SCREEN 1,0,2:LOAD@"puz.tif":COLOR 2,%15
10040 GET@A(69,20)-(160,88),SNE
10050 GET@A(177,20)-(246,39),PNE
10060 GET@A(69,0)-(176,19),SNU
10070 GET@A(177,0)-(246,19),PNU
10080 GET@A(200,150)-(434,240),WNUM
10090 GET@A(0,150)-(189,356),WWIN
10100 GET@A(200,250)-(383,306),WYNO
10110 LINE(0,20)-(639,479),PSET,%6,BF:SCREEN 1,0,3
10120 NX=176:NY=100
10130 SX=200:SY=200:SX=100:SY=50
10140 MOUSE 0
10150 FOR I=0 TO 1:A$(I)="":READ D$:FOR J=0 TO 31
10160 A$(I)=A$(I)+CHR$(VAL("&h"+MID$(D$,J*2+1,2)))
10170 NEXT:NEXT:MOUSE 2,A$(0),A$(1),0,0
10180 MOUSE 1,320,240,1
10190 DATA 7FFF3FFF1FFF07FF03FF01FF00FF007F003F001F007F00FF107F387FF87FFC7F
10200 DATA 000000004000200058003C005E002F005F805400460002000300010000000000
10210 *LOOP
10220 DATA 0,68,69,176,177,246,587,606,610,629,999,999
10230 WHILE NOT MOUSE(2,0):WEND
10240 X=MOUSE(4,0):Y=MOUSE(5,0)
10250 IF Y>19 THEN *MOVS
10260 RESTORE *LOOP
10270 I=0:A=0:WHILE A<>999:I=I+1:READ A,B
10280 IF A=<X AND X<=B THEN A=999
10290 WEND
10300 ON I GOSUB *CP_START,*INPUZ,*PRT,*CP_START,*END
10310 WHILE MOUSE(2,0):WEND
10320 GOTO *LOOP
10330 *PRT
10340 PUT@A(177,20)-(246,39),PNE
10350 LINE(177,0)-(246,19),PSET,%1,B
10360 LINE(178,1)-(245,18),PSET,%1,B
10370 WHILE MOUSE(2,0):GOSUB *PRT_MOV:WEND
10380 X=MOUSE(7,0):Y=MOUSE(8,0)
10390 IF 177<X AND X<246 AND 20<Y AND Y<34 THEN *PRT_MOS
10400 WHILE NOT MOUSE(2,0):GOSUB *PRT_MOV:WEND
10410 X=MOUSE(4,0):Y=MOUSE(5,0)
10420 IF 177<X AND X<246 AND 20<Y AND Y<34 THEN *PRT_MOS
10430 LINE(177,20)-(246,39),PSET,%6,BF
10440 PUT@A(177,0)-(246,19),PNU
10450 RETURN
10460 *PRT_MOV
10470 X=MOUSE(0):Y=MOUSE(1)
10480 IF X<68 OR 177<X OR 20<Y THEN *PRT_MOVS
10490 LINE(177,20)-(246,39),PSET,%6,BF
10500 PUT@A(177,0)-(246,19),PNU
10510 GOTO *INPUZ
10520 *PRT_MOVS
10530 IF 177>X OR X>246 OR 20>Y OR Y>34 THEN RETURN
10540 IF POINT(179,21)=-1 THEN RETURN
10550 LINE(179,21)-(242,35),XOR,%8,BF
10560 RETURN
10570 *PRT_MOS
10580 LINE(177,20)-(246,39),PSET,%6,BF
10590 PUT@A(177,0)-(246,19),PNU
10600 GET@A (230,220)-(413,276),B
10610 PUT@A (230,220)-(413,276),WYNO
10620 GET@A (236,226)-(337,242),A
10630 LINE (236,226)-(408,242),PSET,%15,BF
10640 PUT@A (270,226)-(371,242),A
10650 GOSUB *YNO_LOOP
10660 'IF K=0 THEN HARDC 3,(SX+2,SY+19)-(SX+185,SY+202)
10670 IF K=0 THEN SAVE@"puzdata.tif",(SX+2,SY+19)-(SX+185,SY+202)
10680 PUT@A (230,220)-(413,276),B
10690 RETURN
10700 *MOVS
10710 IF X>SX+1 AND X<SX+16 AND Y>SY+1 AND Y<SY+16 THEN *DELWIN
10720 IF X>SX+18 AND X<SX+188 AND Y>SY+1 AND Y<SY+16 THEN *MOVWIN
10730 GOTO *LOOP
10740 *DELWIN
10750 LINE (SX+1,SY+1)-STEP(15,15),XOR,,BF
10760 WHILE MOUSE(2,0):WEND
10770 LINE (SX,SY)-STEP(189,206),PSET,%6,BF
10780 GOTO *LOOP
10790 *MOVWIN
10800 MOUSE 1,,,0:MX=SX:MY=SY
10810 WHILE MOUSE(2,0)
10820 X=MOUSE(9)+MX:Y=MOUSE(10)+MY
10830 X=X*(X<0)-(450-X)*(X>450)+X:Y=-(20-Y)*(Y<20)-(273-Y)*(Y>273)+Y
10840 LINE (X,Y)-STEP(189,206),XOR,%13,B
10850 LINE (X,Y)-STEP(189,206),XOR,%13,B
10860 MX=X:MY=Y
10870 WEND:MOUSE 1,,,1
10880 GET@A(SX,SY)-(SX+189,SY+206),WWIN
10885 LINE (SX,SY)-(SX+189,SY+206),PSET,%6,BF
10890 SX=X:SY=Y
10900 PUT@A(SX,SY)-(SX+189,SY+206),WWIN
10910 GOTO *LOOP
10920 *END
10930 GET@A (230,220)-(413,276),B
10940 PUT@A (230,220)-(413,276),WYNO
10950 GET@A (344,226)-(408,242),A
10960 LINE (236,226)-(408,242),PSET,%15,BF
10970 PUT@A (288,226)-(352,242),A
10980 GOSUB *YNO_LOOP
10990 PUT@A (230,220)-(413,276),B
11000 IF K=0 THEN MOUSE 5:END
11010 RETURN
11020 *YNO_LOOP
11030 K=0:WHILE MOUSE(2,0):WEND
11040 WHILE NOT MOUSE(2,0):WEND
11050 X=MOUSE(4,0):Y=MOUSE(5,0)
11060 IF Y<251 OR Y>269 OR X<293 OR X>407 THEN *YNO_LOOP
11070 IF X>344 AND X<356 THEN *YNO_LOOP
11080 K=(X-293)\60
11090 LINE(294+K*63,252)-STEP(49,16),XOR,%8,BF
11100 WHILE MOUSE(2,0):WEND
11110 LINE(294+K*63,252)-STEP(49,16),XOR,%8,BF
11120 IF NOT (MOUSE(7,0)=X AND MOUSE(8,0)=Y) THEN *YNO_LOOP
11130 RETURN
11140 *INPUZ
11150 PUT@A(69,20)-(160,88),SNE
11160 LINE(69,0)-(176,19),PSET,%1,B
11170 LINE(70,1)-(175,18),PSET,%1,B
11180 WHILE MOUSE(2,0):GOSUB *INPUZ_MOV:WEND
11190 X=MOUSE(7,0):Y=MOUSE(8,0)
11200 IF 69<X AND X<160 AND 20<Y AND Y<83 THEN *INPUZ_MOS
11210 WHILE NOT MOUSE(2,0):GOSUB *INPUZ_MOV:WEND
11220 X=MOUSE(4,0):Y=MOUSE(5,0)
11230 IF 69<X AND X<160 AND 20<Y AND Y<83 THEN *INPUZ_MOS
11240 LINE(69,20)-(160,88),PSET,%6,BF
11250 PUT@A(69,0)-(176,19),SNU
11260 RETURN
11270 *INPUZ_MOV
11280 X=MOUSE(0):Y=MOUSE(1)
11290 IF X<176 OR 247<X OR 20<Y THEN *INPUZ_MOVS
11300 LINE(69,20)-(160,88),PSET,%6,BF
11310 PUT@A(69,0)-(176,19),SNU
11320 GOTO *PRT
11330 *INPUZ_MOVS
11340 IF X<69 OR 160<X OR Y<20 OR 83<Y THEN RETURN
11350 Y=((Y-20)\16)*16+21
11360 IF POINT(71,Y)=-1 THEN RETURN
11370 PUT@A(69,20)-(160,88),SNE
11380 LINE(71,Y)-STEP(85,14),XOR,%8,BF
11390 RETURN
11400 *INPUZ_MOS
11410 DATA 103,sl,39,nl,70,nu,60,bo,0,e
11420 R=(Y-20)\16+1:RESTORE *INPUZ_MOS
11430 FOR I=1 TO R:READ NA,NA$:I=I-R*(NA$="e"):NEXT
11440 IF NA$="e" THEN *INPUZ
11450 OPEN "("+MID$(STR$(NA),2)+")pu_"+NA$+".pzd" AS #1
11460 L=LOF(1):CLOSE #1
11470 PUT@A(NX,NY)-(NX+234,NY+90),WNUM:A=1
11480 SYMBOL(NX+110,NY+30)," 1",2,1,0
11490 *INPUZ_LOOP
11500 DATA 20,32,61,45,65,32,84,45,149,32,168,45
11510 DATA 172,32,213,45,109,58,160,76,172,58,223,76
11520 K=0:WHILE K<5
11530 WHILE MOUSE(2,0):WEND
11540 WHILE NOT MOUSE(2,0):WEND
11550 X=MOUSE(4,0):Y=MOUSE(5,0):RESTORE *INPUZ_LOOP:K=0
11560 FOR I=1 TO 6
11570 READ X1,Y1,X2,Y2
11580 K=K-(X1+NX<X AND X<X2+NX AND Y1+NY<Y AND Y<Y2+NY)*I
11590 NEXT
11600 M=K*9-19+7*(K>2)
11610 IF 0<K AND K<5 THEN A=A+M
11620 A=-(A-1)*(A>0)+1:A=-(A-L)*(A<L)+L
11630 LINE(NX+110,NY+30)-STEP(32,16),PRESET,%15,BF
11640 SYMBOL(NX+110,NY+30),RIGHT$(STR$(A),2),2,1,0
11650 WEND
11660 LINE(NX+K*63-205,NY+59)-STEP(49,16),XOR,%8,BF
11670 WHILE MOUSE(2,0):WEND
11680 LINE(NX+K*63-205,NY+59)-STEP(49,16),XOR,%8,BF
11690 IF NOT (MOUSE(7,0)=X AND MOUSE(8,0)=Y) THEN *INPUZ_LOOP
11700 LINE(NX,NY)-STEP(234,90),PSET,%6,BF
11710 LINE(69,20)-(160,88),PSET,%6,BF
11720 PUT@A(69,0)-(176,19),SNU
11730 IF K-6 THEN *INPUZ_PUT
11740 LINE(69,20)-(160,88),PSET,%6,BF
11750 PUT@A(69,0)-(176,19),SNU
11760 RETURN
11770 *INPUZ_PUT
11780 OPEN "("+MID$(STR$(NA),2)+")pu_"+NA$+".pzd" AS #1
11790 FIELD #1,NA-2 AS DA$
11800 GET #1,A:CLOSE #1
11810 PUT@A(SX,SY)-(SX+189,SY+206),WWIN
11820 LINE (SX+3,SY+20)-STEP(181,181),PSET,%15,BF
11830 ON R GOSUB *LOAD_SL,*LOAD_NL,*LOAD_NU,*LOAD_BO
11840 GOTO *LOOP
11850 *LOAD_SL
11860 FOR I=0 TO 99:X=I MOD 10:Y=I \ 10:R=VAL(MID$(DA$,I+1,1))
11865 LINE (SX+X*18+3,SY+Y*18+20)-STEP(1,1),PSET,%0,BF
11870 IF R=5 THEN NEXT:RETURN
11880 SYMBOL(SX+X*18+5,SY+Y*18+22),MID$(STR$(R),2),2,1,0
11890 NEXT
11891 FOR I=0 TO 10:LINE (SX+183,SY+I*18+20)-STEP(1,1),PSET,%0,BF:NEXT
11893 FOR I=0 TO 9:LINE (SX+I*18+3,SY+200)-STEP(1,1),PSET,%0,BF:NEXT
11895 RETURN
11900 *LOAD_NL
11910 GOSUB *PUT_MAS
11920 I=0:WHILE VAL(MID$(DA$,I*4+1,4))<>0
11930 X=VAL(MID$(DA$,I*4+1,1))
11940 Y=VAL(MID$(DA$,I*4+2,1))
11950 SYMBOL(SX+X*18+5,SY+Y*18+22),MID$(STR$(I+1),2),2,1,0
11960 X=VAL(MID$(DA$,I*4+3,1))
11970 Y=VAL(MID$(DA$,I*4+4,1))
11980 SYMBOL(SX+X*18+5,SY+Y*18+22),MID$(STR$(I+1),2),2,1,0
11990 I=I+1:WEND
12000 RETURN
12010 *LOAD_NU
12020 GOSUB *PUT_MAS
12030 C=0:WHILE MID$(DA$,C*4+1,1)<>" "
12040 X=VAL(MID$(DA$,C*4+1,1)):Y=VAL(MID$(DA$,C*4+2,1))
12050 R=VAL(MID$(DA$,C*4+3,2))
12060 SYMBOL(SX+X*18+5,SY+Y*18+22),MID$(STR$(R),2),-(R<10)+1,1,0
12070 C=C+1:WEND
12080 RETURN
12090 *LOAD_BO
12100 GOSUB *PUT_MAS
12110 C=0:I=-1:WHILE MID$(DA$,C*2+1,1)<>" "
12120 I=I+VAL("&H"+MID$(DA$,C*2+1,1))+1:X=I MOD 10:Y=I \ 10
12130 R=VAL("&H"+MID$(DA$,C*2+2,1))
12140 SYMBOL(SX+X*18+5,SY+Y*18+22),MID$(STR$(R),2),-(R<10)+1,1,0
12150 C=C+1:WEND
12160 RETURN
12170 *PUT_MAS
12180 FOR I=0 TO 10
12190 LINE (SX+I*18+3,SY+20)-STEP(1,181),PSET,0,B
12200 LINE (SX+3,SY+I*18+20)-STEP(181,1),PSET,0,B
12210 NEXT
12220 RETURN
12230 *CP_START
12240 ON ERROR GOTO *CP_ERR
12250 CP_MMX!=MOUSE(0):CP_MMY!=MOUSE(1)
12260 DIM CP_BA!(71):MOUSE 1,,,1
12270 MOUSE 4,CP_X!,CP_Y!,CP_X!+23,CP_Y!+16
12280 GET@A (CP_X!,CP_Y!)-(CP_X!+25,CP_Y!+17),CP_BA!
12290 LINE (CP_X!,CP_Y!)-STEP(25,17),PSET,7,BF
12300 LINE (CP_X!,CP_Y!)-STEP(25,17),PSET,0,B
12310 LINE (CP_X!,CP_Y!)-STEP(8,8),PSET,0,B
12320 LINE (CP_X!,CP_Y!+8)-STEP(8,9),PSET,0,B
12330 LINE (CP_X!+2,CP_Y!+2)-STEP(4,4),PSET,0,B
12340 LINE (CP_X!+2,CP_Y!+10)-STEP(0,5),PSET,0
12350 LINE (CP_X!+2,CP_Y!+10)-STEP(4,2),PSET,0
12360 LINE (CP_X!+2,CP_Y!+15)-STEP(4,-2),PSET,0
12370 CDINF CP_IN%:CDSTAT CP_ST%
12380 CP_ST!=CP_ST%(5)-(CP_ST%(1)=0)
12390 IF CP_ST%(1) THEN LINE (CP_X!+1,CP_Y!+9)-STEP(6,7),XOR,7,BF
12400 *CP_LOOP
12410 CDSTAT CP_ST%
12420 LINE(CP_X!+9,CP_Y!+1)-STEP(15,15),PSET,7,BF
12430 SYMBOL (CP_X!+9,CP_Y!+1),RIGHT$(STR$(CP_ST!),2),1,1,0
12440 WHILE MOUSE(2,0) OR MOUSE(2,1):CDSTAT CP_ST%:WEND
12450 WHILE MOUSE(2,0)=0 AND MOUSE(2,1)=0:CDSTAT CP_ST%:WEND
12460 IF MOUSE(2,1) THEN *CP_END
12470 CP_MX!=MOUSE(4,0)-CP_X!:CP_MY!=MOUSE(5,0)-CP_Y!-1
12480 CP_R=CP_MX!\8+(CP_MY!\8)*3
12490 IF CP_MY!=-1 THEN *CP_MOV
12500 CP_ST!=CP_ST!+(CP_R=1 OR CP_R=4)-(CP_R=2 OR CP_R=5)
12510 CP_ST!=CP_ST!+(CP_ST!>CP_IN%(5))-(CP_ST!<1)
12520 IF CP_ST!<>CP_ST%(5) AND CP_ST%(1)=1 THEN *CP_PL
12530 IF CP_R=0 AND CP_ST%(1)=1 THEN *CP_ST
12540 IF CP_R=3 AND CP_ST%(1)=0 THEN *CP_PL
12550 GOTO *CP_LOOP
12560 *CP_PL
12570 IF CP_IF%(1)>1 AND CP_ST%(1)=1 THEN GOTO *CP_LOOP
12580 IF CP_ST%(1)=0 THEN LINE (CP_X!+1,CP_Y!+9)-STEP(6,7),XOR,7,BF
12590 CD PLAY CP_ST!:GOTO *CP_LOOP
12600 *CP_ST
12610 LINE (CP_X!+1,CP_Y!+9)-STEP(6,7),XOR,7,BF
12620 CD STOP:GOTO *CP_LOOP
12630 *CP_NODISK
12640 IF CP_ST!>-1 THEN LINE(CP_X!,CP_Y!)-STEP(25,17),XOR,7,BF
12650 IF MOUSE(2,1) THEN *CP_END
12660 CP_ST!=-1
12670 CDINF CP_IN%:CDSTAT CP_ST%
12680 CP_ST!=CP_ST%(5)-(CP_ST%(1)=0)
12690 LINE(CP_X!,CP_Y!)-STEP(25,17),XOR,7,BF
12700 GOTO *CP_LOOP
12710 *CP_MOV
12720 ON ERROR GOTO 0:MOUSE 4,25,0,614,462
12730 CP_MX!=MOUSE(9):CP_MY!=MOUSE(10):CP_MX!=CP_X!:CP_MY!=CP_Y!
12740 WHILE MOUSE(2,0)
12750 LINE(CP_MX!,CP_MY!)-STEP(25,17),XOR,7,B
12760 CP_MX!=CP_MX!+MOUSE(9):CP_MY!=CP_MY!+MOUSE(10)
12770 LINE(CP_MX!,CP_MY!)-STEP(25,17),XOR,7,B
12780 WEND
12790 LINE(CP_MX!,CP_MY!)-STEP(25,17),XOR,7,B
12800 PUT@A (CP_X!,CP_Y!)-(CP_X!+25,CP_Y!+17),CP_BA!
12810 CP_X!=CP_MX!:CP_Y!=CP_MY!:GOTO *CP_START
12820 *CP_ERR
12830 IF ERR=53 THEN RESUME *CP_NODISK
12840 IF ERR=10 THEN RESUME NEXT
12850 PRINT ERR,ERL:ERROR ERR
12860 *CP_END
12870 PUT@A (CP_X!,CP_Y!)-(CP_X!+25,CP_Y!+17),CP_BA!
12880 MOUSE 4,0,0,639,479:MOUSE 1,CP_MMX!,CP_MMY!,1
12890 RETURN